﻿using System;
using System.Collections.Generic;
using System.Globalization;
using System.Linq;
using System.Web.Mvc;
using DTTB.MV2.QUANLYNHANSUTIENLUONG.Models.LinQ.Common;
using DTTB.MV2.QUANLYNHANSUTIENLUONG.Models.LinQ.Error;
using Webdiyer.WebControls.Mvc;
using TB_Department = DTTB.MV2.QUANLYNHANSUTIENLUONG.Models.LinQ.Common.TB_Department;
using TB_User = DTTB.MV2.QUANLYNHANSUTIENLUONG.Models.LinQ.Common.TB_User;
using System.Security.Cryptography;

namespace DTTB.MV2.QUANLYNHANSUTIENLUONG.BussinessDelegate.CommonDelegate
{
    public class CommonDelegate : Controller
    {
        DBErrorDataContext DBError = new DBErrorDataContext();
        DBCommonDataContext DBCommon = new DBCommonDataContext();

        #region Hàm Liên quan tới Ghi nhận lỗi hệ thống
        //Ghi nhận lại thông tin lỗi phát hiện khi sử dụng hệ thống
        public void GhiNhanLoi(Exception e, string url)
        {
            string[] urlItems = url.Split('/');

            //string action = urlItems[urlItems.Count() - 1].Split('?')[0];
            string action = urlItems[4].Split('?')[0];

            var error = new TB_Error
                            {
                                UserID = Convert.ToInt32(Session["USERID"]),
                                CreateDate = DateTime.Now,
                                Message =  e.Message + " | " + e.StackTrace,
                                //Module = urlItems[urlItems.Count() - 2],
                                Module = urlItems[3],
                                Action = action,
                                Url = url
                            };
            DBError.TB_Errors.InsertOnSubmit(error);
            DBError.SubmitChanges();
        }
 #endregion

 #region Hàm Liên quan tới Tạo sẵn các đường dẫn file

        public string GetPathForUploadFileAll(string Modul, string id, DateTime CreatedDate)
        {
            string directoryName = Modul + "." + id + "." + (CreatedDate).ToString("dd") + (CreatedDate).ToString("MM") + (CreatedDate).ToString("yyyy");
            string directoryPath = "~/UploadFile/" + (CreatedDate).ToString("yyyy") + "/" + Modul
                + "/Thang." + (CreatedDate).ToString("MM") + "." + (CreatedDate).ToString("yyyy") + "/" + directoryName;
            return directoryPath;
        }


        /// <summary>
        /// Xóa 1 File trong thư mục, nếu thư mục rỗng thì xóa luôn thư mục
        /// </summary>
        /// <param name="filename">Tên file cần xóa</param>
        /// <param name="DirectoryPath">Thư mục chứa file cần xóa</param>
        public void DeleteOneFile(string filename, string DirectoryPath)
        {
            if (System.IO.Directory.Exists(DirectoryPath))
            {
                System.IO.FileInfo file = new System.IO.FileInfo(DirectoryPath + "\\" + filename);

                if (file.Exists)
                {
                    //Xoa file
                    file.Delete();
                }

                if (System.IO.Directory.GetFiles(DirectoryPath).Length == 0)
                {
                    System.IO.Directory.Delete(DirectoryPath);
                }
            }
        }

 #endregion


#region Hàm Liên quan tới table TB_Users
        //hàm lấy giới tính của user
        public bool GetSexForUser(int idUser)
        {
            try
            {
                return Convert.ToBoolean(DBCommon.TB_Users.Single(p => p.ID == idUser).Sex);
            }
            catch (Exception)
            {
                return true;
            }
        }

        // Lấy tất cả user đang hoặt động trong hệ thống
        public IList<TB_User> GetAllUsers()
        {
            return DBCommon.TB_Users.Where(p => p.IsActive == true && p.IsDelete == false).OrderBy(p => p.FullName).ToList();
        }
        
        /// <summary>
        /// Lấy Top Users theo số lượng
        /// </summary>
        /// <param name="SoLuong">số lượng user cần lấy</param>
        /// <returns>Danh sách top user theo Số lượng</returns>
        public IList<TB_User> GetUsersTheoSoLuongOrderByname(int SoLuong)
        {
            return DBCommon.TB_Users.Where(p => p.IsActive == true && p.IsDelete == false).Take(SoLuong).OrderBy(p => p.FullName).ToList();
        }

        //Lấy những user thuộc department có Id = departmentId
        public IEnumerable<TB_User> GetUsersByDepartmenId(string departmentId)
        { 
            return DBCommon.TB_Users.Where(p => p.Department == Convert.ToInt32(departmentId)
                && p.IsDelete == false && p.IsActive == true).OrderByDescending(p => p.JobTitle).ToList();
        }

        //Lấy những user thuộc department có Id = departmentId
        public IEnumerable<TB_User> GetUsersByDepartmenIdOrderByName(string departmentId)
        {
            return DBCommon.TB_Users.Where(p => p.Department == Convert.ToInt32(departmentId)
                && p.IsDelete == false && p.IsActive == true).OrderBy(p => p.FullName).ToList();
        }

        public IList<TB_User> LayUSERPhongBan(string departmentId)
        {
            return DBCommon.TB_Users.Where(p => p.Department == Convert.ToInt32(departmentId)
                && p.IsDelete == false && p.IsActive == true).OrderByDescending(p => p.JobTitle).ToList();
        }

        // Lấy những user không thuộc Departmet nào
        public IList<TB_User> GetAllUsersNotDepartment()
        {
            return DBCommon.TB_Users.Where(p => p.Department == null).ToList();
        }

        // Lấy danh sách User là trưởng phòng
        public IList<TB_User> GetAllUsersIsChef()
        {
            List<TB_Department> ListDep = this.GetAllDepartments().OrderBy(p => p.DepartmentName).ToList();
            List<TB_User> ListUser = new List<TB_User>();
            foreach (TB_Department item in ListDep)
            {
                if (item.IdChief != null && item.IdChief.Value > 0)
                {
                    TB_User objUser = this.GetUserByUserId(item.IdChief.ToString());
                    if (objUser != null && objUser.ID > 0)
                        ListUser.Add(objUser);
                }
            }
            return ListUser;
        }

        // lấy display name của phòng ban hoặc user lên cây quy trinh
        public string GetDisplayNameUserToTreeView(int? IdXuLy, char? UserType)
        {
            string kq = "";
            if (UserType != null && UserType.Value == 'u')
            {
                TB_User user = DBCommon.TB_Users.Single(p => p.ID == Convert.ToInt32(IdXuLy));

                TB_Department objdep = user.Department != null ? this.GetDepartmentByDepartmentId(user.Department.ToString()) : null;
                DTTB.MV2.QUANLYNHANSUTIENLUONG.Models.LinQ.Common.TB_JobTitle objJob = user.JobTitle != null ? this.GetJobTitleByJobTitleId(user.JobTitle.Value.ToString()) : null;
                kq = ((string.IsNullOrEmpty(user.FullName))
                                  ? user.UserName
                                  : user.FullName)
                 + "(" + (objJob != null ? objJob.JobTitle : "") + "-" + (objdep != null ? objdep.DepartmentName : "") + ")";
            }
            else if (UserType != null && UserType.Value == 'd')
            {
                //TB_Department objDep = DBCommon.TB_Departments.SingleOrDefault(p => p.ID == IdXuLy);
                //kq = objDep.DepartmentName;
                TB_Department objDep = this.GetDepartmentByDepartmentId(IdXuLy.ToString());
                //TB_User obj = this.GetUserByUserId(objDep.IdChief != null ? objDep.IdChief.ToString() : "0");
                TB_User user = new TB_User();//this.GetUserByUserId(objDep.IdChief != null ? objDep.IdChief.ToString() : "0");
                if (objDep.IdChief != null)
                {
                    user = this.GetUserByUserId(objDep.IdChief.Value.ToString());
                    Models.LinQ.Common.TB_JobTitle objJob = user.JobTitle != null ? this.GetJobTitleByJobTitleId(user.JobTitle.Value.ToString()) : null;
                    kq = ((string.IsNullOrEmpty(user.FullName))
                                   ? user.UserName
                                   : user.FullName)
                            + "(" + (objJob != null ? objJob.JobTitle : "") + "-" + objDep.DepartmentName + ")";
                }
                else
                {
                    kq = objDep.DepartmentName;
                }
            }
            return kq;
        }

        public TB_User GetUserToTreeView(int? IdXuLy, char? UserType)
        {
            string kq = "";
            if (UserType != null && UserType.Value == 'u')
            {
                TB_User user = DBCommon.TB_Users.Single(p => p.ID == Convert.ToInt32(IdXuLy));

                return user;
            }
            else if (UserType != null && UserType.Value == 'd')
            {
                TB_Department objDep = DBCommon.TB_Departments.SingleOrDefault(p => p.ID == IdXuLy);
                if (objDep.IdChief!=null&&objDep.IdChief.Value>0)
                {
                    TB_User user = DBCommon.TB_Users.Single(p => p.ID == Convert.ToInt32(objDep.IdChief));
                    return user;
                }
            }
            return new TB_User();
        }

        public TB_User GetUserNameByUserId(string userId)
        {
            try
            {
                return DBCommon.TB_Users.Single(p => p.ID == Convert.ToInt32(userId));
            }
            catch (Exception)
            {
                return new TB_User();
            }
        }
        
        public TB_User GetUserByUserId(string userId)
        {
            try
            {
                return DBCommon.TB_Users.Single(p => p.ID == Convert.ToInt32(userId));
               
            }
            catch (Exception)
            {
                return new TB_User();
            }
        }
        
        public string GetDisplayNameByUserId(string userId)
        {
            try
            {
                TB_User user = DBCommon.TB_Users.Single(p => p.ID == Convert.ToInt32(userId));

                string DisplayName = (string.IsNullOrEmpty(user.FullName))
                                 ? user.UserName
                                 : user.FullName;

                return DisplayName;
            }
            catch (Exception)
            {
                return string.Empty;
            }
        }
        public string GetDisplayNameAndDepNameByUserId(string userId)
        {
            try
            {
                TB_User user = DBCommon.TB_Users.Single(p => p.ID == Convert.ToInt32(userId));
                TB_Department objdep = user.Department != null ? this.GetDepartmentByDepartmentId(user.Department.ToString()) : null;
                DTTB.MV2.QUANLYNHANSUTIENLUONG.Models.LinQ.Common.TB_JobTitle objJob = user.JobTitle != null ? this.GetJobTitleByJobTitleId(user.JobTitle.Value.ToString()) : null;

                string DisplayName = ((string.IsNullOrEmpty(user.FullName))
                                  ? user.UserName
                                  : user.FullName)
                                  + "(" + (objdep != null ? objdep.DepartmentName : "") + ", " + (objJob != null ? objJob.JobTitle : "") + ")";

                return DisplayName;
            }
            catch (Exception)
            {
                return string.Empty;
            }
        }

#endregion
        // lấy display image của phòng ban hoặc user lên cây quy trinh
        public string GetDisplayImageUserToTreeView(int? IdXuLy, char? UserType)
        {
            string kq = "";
            if (UserType != null && UserType.Value == 'u')
            {
                TB_User user = DBCommon.TB_Users.Single(p => p.ID == Convert.ToInt32(IdXuLy));
                kq = this.GetSexForUser(user.ID) ? "../../Content/ImagesAdmin/User.png" : "../../Content/ImagesAdmin/User_Female.png";
            }
            else if (UserType != null && UserType.Value == 'd')
            {
                TB_Department objDep = this.GetDepartmentByDepartmentId(IdXuLy.ToString());
                kq = objDep.IdChief == null ? "../../Content/ImagesAdmin/User.png" :
                    this.GetSexForUser(objDep.IdChief.Value) ? "../../Content/ImagesAdmin/User.png" : "../../Content/ImagesAdmin/User_Female.png";
            }
            return kq;
        }

#region Hàm liên quan tới table TB_Departments
        
        public TB_Department GetDepartmentByDepartmentId(string departmentId)
        {
            return DBCommon.TB_Departments.SingleOrDefault(p => p.ID == Convert.ToInt32(departmentId));
        }



        public IList<TB_Department> GetAllDepartments()
        {
            return DBCommon.TB_Departments.Where(p => p.IsDelete == false).ToList();
        }

        public IList<TB_Department> GetDepartmentsTheoSoLuong(int SoLuong)
        {
            return DBCommon.TB_Departments.Where(p => p.IsDelete == false).Take(SoLuong).ToList();
        }
#endregion

        #region Hàm liên quan đến jobtitle

        public DTTB.MV2.QUANLYNHANSUTIENLUONG.Models.LinQ.Common.TB_JobTitle GetJobTitleByJobTitleId(string JobtitleId)
        {
            try
            {
                return DBCommon.TB_JobTitles.Single(p => p.ID == Convert.ToInt32(JobtitleId));
            }
            catch (Exception)
            {
                
                return  null;
            }
            
        }

        #endregion


#region hàm liên quan tới bảng CoQuanXuDung
        public dm_CoQuanSuDung GetCoQuanSuDung()
        {
            try
            {
                return DBCommon.dm_CoQuanSuDungs.ToList()[0];
            }
            catch (Exception)
            {
                return null;
            }
        }

#endregion


        #region Hàm liên quan tới datetime

        public DateTime FixDate(DateTime date, int type)
        {
            string strdate = date.Year + "-" + date.Month + "-" + date.Day;
            strdate += type == 1 ? " 00:00:00" : " 23:59:00";
            return DateTime.Parse(strdate);
        }

        public DateTime? ConvertToDateTine(string strDate)// strDate=dd/mm/yyyy
        {
            string[] arr = strDate.Split('/');
            if (arr.Length != 3)
                return null;
            else
            {
                string converdate = arr[2] + "-" + arr[1] + "-" + arr[0];
                return DateTime.Parse(converdate);
            }
        }

        public DateTime? ConverToTime(string strTime) // strTime="hh:mm:ss"
        {
            string[] arr = strTime.Split(':');
            if (arr.Length != 3)
                return null;
            else
            {
                DateTime date = DateTime.Parse(DateTime.Today.ToString("yyyy-MM-dd") + " " + strTime);
                return date;
            }
        }

        public DateTime? ConverToTime(string HH, string mm)
        {
            string time = HH + ":" + mm + ":" + "00";
            return ConverToTime(time);
        }

        //BACNP
        /// <summary>
        /// Chuyển chuỗi ngày tháng ("vi-vn") sang Ngày Tháng
        /// </summary>
        /// <param name="strDate"></param>
        /// <returns></returns>
        public DateTime? ConvertStringToDateTime(string strDate)
        {
            DateTime? result = null;
            try
            {
                result = DateTime.Parse(strDate, new CultureInfo("vi-vn"));
            }
            catch
            { }
            return result;
        }

        //BACNP
        /// <summary>
        /// Chuyển thành Ngày Tháng
        /// </summary>
        /// <param name="ngay"></param>
        /// <param name="thang"></param>
        /// <param name="nam"></param>
        /// <returns></returns>
        public DateTime? ConvertToDateTime(string ngay, string thang, string nam)
        {
            DateTime? result = null;
            try
            {
                result = DateTime.Parse(ngay + "/" + thang + "/" + nam, new CultureInfo("vi-vn"));
            }
            catch
            {
            }
            return result;
        }

        //BACNP
        /// <summary>
        /// Chuyển thành Ngày Tháng
        /// </summary>
        /// <param name="ngay"></param>
        /// <param name="thang"></param>
        /// <param name="nam"></param>
        /// <returns></returns>
        public DateTime? ConvertToDateTime(int? ngay, int? thang, int? nam)
        {
            return ConvertToDateTime(Convert.ToString(ngay), Convert.ToString(thang), Convert.ToString(nam));
        }

        //BACNP
        /// <summary>
        /// Chuyển Ngày Tháng sang chuỗi (dd/MM/yyyy)
        /// </summary>
        /// <param name="objDate"></param>
        /// <returns></returns>
        public string ConvertDateTimeToString(DateTime? objDate)
        {
            string result = string.Empty;
            try
            {
                result = objDate.Value.ToString("dd/MM/yyyy");
            }
            catch
            { }
            return result;
        }

        //BACNP
        /// <summary>
        /// Chuyển đổi Chuỗi ngày tháng sang tiếng Việt
        /// </summary>
        /// <param name="NgayThang"></param>
        /// <returns>Ngày tháng tiếng Việt hoặc string.Empty nếu xảy ra lỗi</returns>
        public string ConvertStringDateTimeToVietnamese(DateTime? objNgayThang)
        {
            try
            {
                return GetDateTimeVietnamese(objNgayThang);
            }
            catch
            {
                return string.Empty;
            }
        }

        //BACNP
        /// <summary>
        /// Chuyển đổi Chuỗi ngày tháng sang tiếng Việt
        /// </summary>
        /// <param name="NgayThang">Chuỗi ngày tháng (dd/MM/yyyy)</param>
        /// <returns>Ngày tháng tiếng Việt hoặc string.Empty nếu xảy ra lỗi</returns>
        public string ConvertStringDateTimeToVietnamese(string NgayThang)
        {
            DateTime? objDate = null;
            try
            {
                objDate = DateTime.Parse(NgayThang, new System.Globalization.CultureInfo("vi-vn"));
                return GetDateTimeVietnamese(objDate);
            }
            catch
            {
                return string.Empty;
            }
        }

        //BACNP
        /// <summary>
        /// Lấy Ngày Tháng Tiếng Việt
        /// </summary>
        /// <param name="NgayThang"></param>
        /// <returns></returns>
        private string GetDateTimeVietnamese(DateTime? NgayThang)
        {
            string result = string.Empty;

            if (NgayThang != null)
            {
                result = "Ngày " + this.ConvertNumberToVietnamese(NgayThang.Value.Day)
                        + " tháng " + this.ConvertNumberToVietnamese(NgayThang.Value.Month)
                        + " năm " + this.ConvertNumberToVietnamese(NgayThang.Value.Year);
            }

            return result;
        }

        /// <summary>
        /// Chuyển đổi từ số sang chữ
        /// </summary>
        /// <param name="number"></param>
        /// <returns></returns>
        private string ConvertNumberToVietnamese(double number)
        {
            string s = number.ToString("#");
            string[] so = new string[] { "không", "một", "hai", "ba", "bốn", "năm", "sáu", "bảy", "tám", "chín" };
            string[] hang = new string[] { "", "nghìn", "triệu", "tỷ" };
            int i, j, donvi, chuc, tram;
            string str = " ";
            bool booAm = false;
            double decS = 0;

            try
            {
                decS = Convert.ToDouble(s.ToString());
            }
            catch
            {
            }
            if (decS < 0)
            {
                decS = -decS;
                s = decS.ToString();
                booAm = true;
            }
            i = s.Length;
            if (i == 0)
                str = so[0] + str;
            else
            {
                j = 0;
                while (i > 0)
                {
                    donvi = Convert.ToInt32(s.Substring(i - 1, 1));
                    i--;
                    if (i > 0)
                        chuc = Convert.ToInt32(s.Substring(i - 1, 1));
                    else
                        chuc = -1;
                    i--;
                    if (i > 0)
                        tram = Convert.ToInt32(s.Substring(i - 1, 1));
                    else
                        tram = -1;
                    i--;
                    if ((donvi > 0) || (chuc > 0) || (tram > 0) || (j == 3))
                        str = hang[j] + str;
                    j++;
                    if (j > 3) j = 1;
                    if ((donvi == 1) && (chuc > 1))
                        str = "một " + str;
                    else
                    {
                        if ((donvi == 5) && (chuc > 0))
                            str = "lăm " + str;
                        else if (donvi > 0)
                            str = so[donvi] + " " + str;
                    }
                    if (chuc < 0)
                        break;
                    else
                    {
                        if ((chuc == 0) && (donvi > 0)) str = "lẻ " + str;
                        if (chuc == 1) str = "mười " + str;
                        if (chuc > 1) str = so[chuc] + " mươi " + str;
                    }
                    if (tram < 0) break;
                    else
                    {
                        if ((tram > 0) || (chuc > 0) || (donvi > 0)) str = so[tram] + " trăm " + str;
                    }
                    str = " " + str;
                }
            }
            if (booAm) str = "Âm " + str;
            return str.Trim();
        }

        /// <summary>
        /// Kiểm tra xem một ngày có phải là chủ nhật hay không
        /// </summary>
        /// <param name="objNgayThang"></param>
        /// <returns></returns>
        public bool DateIsSunday(DateTime objNgayThang)
        {
            return objNgayThang.DayOfWeek == DayOfWeek.Sunday;
        }

        /// <summary>
        /// Kiểm tra xem một ngày có phải là chủ nhật hay không
        /// </summary>
        /// <param name="NgayThang">dd/MM/yyyy</param>
        /// <returns></returns>
        public bool DateIsSunday(string NgayThang)
        {
            return DateIsSunday(DateTime.Parse(NgayThang, new CultureInfo("vi-vn")));
        }

        /// <summary>
        /// Kiểm tra xem một ngày có phải là chủ nhật hay không
        /// </summary>
        /// <param name="ngay">Ngày</param>
        /// <param name="thang">Tháng</param>
        /// <param name="nam">Năm</param>
        /// <returns></returns>
        public bool DateIsSunday(string ngay, string thang, string nam)
        {
            return DateIsSunday(ngay + "/" + thang + "/" + nam);
        }

        /// <summary>
        /// Kiểm tra xem một ngày có phải là chủ nhật hay không
        /// </summary>
        /// <param name="ngay">Ngày</param>
        /// <param name="thang">Tháng</param>
        /// <param name="nam">Năm</param>
        /// <returns></returns>
        public bool DateIsSunday(int ngay, int thang, int nam)
        {
            return DateIsSunday(Convert.ToString(ngay), Convert.ToString(thang), Convert.ToString(nam));
        }

        /// <summary>
        /// Kiểm Tra Các tham số truyền vào có phải là ngày tháng hay không
        /// </summary>
        /// <param name="ngay"></param>
        /// <param name="thang"></param>
        /// <param name="nam"></param>
        /// <returns></returns>
        public bool IsDateTime(int? ngay, int? thang, int? nam)
        {
            return
                ConvertToDateTime(ngay, thang, nam) != null;
        }

        /// <summary>
        /// Lấy tên thứ mấy trong tuần của Ngày
        /// </summary>
        /// <param name="ngaythang"></param>
        /// <returns></returns>
        public string GetDayOfWeek(DateTime? ngaythang)
        {
            try
            {
                string result;
                switch (ngaythang.Value.DayOfWeek)
                {
                    case DayOfWeek.Monday:
                        result = "Thứ hai";
                        break;
                    case DayOfWeek.Tuesday:
                        result= "Thứ ba";
                        break;
                    case DayOfWeek.Wednesday:
                        result = "Thứ tư";
                        break;
                    case DayOfWeek.Thursday:
                        result = "Thứ năm";
                        break;
                    case DayOfWeek.Friday:
                        result = "Thứ sáu";
                        break;
                    case DayOfWeek.Saturday:
                        result = "Thứ bảy";
                        break;
                    default:
                        result = "Chủ Nhật";
                        break;
                }
                return result;
            }
            catch (Exception)
            {
                return string.Empty;
            }
        }

        /// <summary>
        /// So sánh Ngày tháng bằng nhau (Chỉ Xét đến Ngày, Tháng và Năm)
        /// </summary>
        /// <param name="ngayGoc"></param>
        /// <param name="ngaySoSanh"></param>
        /// <returns></returns>
        public bool DateTimeIsEqual(DateTime? ngayGoc, DateTime ngaySoSanh)
        {
            try
            {
                return ngayGoc.Value.Day == ngaySoSanh.Day && ngayGoc.Value.Month == ngaySoSanh.Month && ngayGoc.Value.Year == ngaySoSanh.Year;
            }
            catch(Exception)
            {
                return false;
            }
        }

        public IList<int> GetListDateIsSunDay(int thang, int nam)
        {
            var result = new List<int>();
            //Ngày đầu tiên của tháng
            DateTime ngayDauTrongThang = ConvertToDateTime(1, thang, nam).Value;

            //Tổng Số Ngày Trong Tháng
            int soNgayTrongThang = DateTime.DaysInMonth(nam, thang);

            //Thêm Ngày Chủ Nhật Vào List
            for (int indexNgay = 0; indexNgay <= soNgayTrongThang; indexNgay++)
            {
                if (ngayDauTrongThang.AddDays(indexNgay).DayOfWeek == DayOfWeek.Sunday)
                    result.Add(indexNgay + 1);
            }
            return result;
        }

        #endregion



#region Một số hàm hữu ích

        //Sắp xếp mảng user tăng theo giá trị tăng của mảng phụ
        public void SapXepTangDan(TB_User[] arrayUser, double[] arrayXuLyTemp)
        {
            for (int i = 0; i < arrayXuLyTemp.Count() - 1; i++)
            {
                for (int j = i + 1; j < arrayXuLyTemp.Count(); j++)
                {
                    if(arrayXuLyTemp[j] < arrayXuLyTemp[i])
                    {
                        //thay đổi vị trí mảng tạm
                        double bufferForArray = arrayXuLyTemp[i];
                        arrayXuLyTemp[i] = arrayXuLyTemp[j];
                        arrayXuLyTemp[j] = bufferForArray;

                        //thay đổi vị trí danh sách chính : userlist
                        TB_User bufferForList = arrayUser[i];
                        arrayUser[i] = arrayUser[j];
                        arrayUser[j] = bufferForList;
                    }
                }
            }
        }

        //Sắp xếp mảng user giảm theo giá trị giảm của mảng phụ
        public void SapXepGiamDan(TB_User[] arrayUser, double[] arrayXuLyTemp)
        {
            for (int i = 0; i < arrayXuLyTemp.Count() - 1; i++)
            {
                for (int j = i + 1; j < arrayXuLyTemp.Count(); j++)
                {
                    if (arrayXuLyTemp[j] > arrayXuLyTemp[i])
                    {
                        //thay đổi vị trí mảng tạm
                        double bufferForArray = arrayXuLyTemp[i];
                        arrayXuLyTemp[i] = arrayXuLyTemp[j];
                        arrayXuLyTemp[j] = bufferForArray;

                        //thay đổi vị trí danh sách chính : userlist
                        TB_User bufferForList = arrayUser[i];
                        arrayUser[i] = arrayUser[j];
                        arrayUser[j] = bufferForList;
                    }
                }
            }
        }
        
        //Sắp xếp mảng department tăng theo giá trị tăng của mảng phụ
        public void SapXepTangDan(TB_Department[] arrayUser, double[] arrayXuLyTemp)
        {
            for (int i = 0; i < arrayXuLyTemp.Count() - 1; i++)
            {
                for (int j = i + 1; j < arrayXuLyTemp.Count(); j++)
                {
                    if(arrayXuLyTemp[j] < arrayXuLyTemp[i])
                    {
                        //thay đổi vị trí mảng tạm
                        double bufferForArray = arrayXuLyTemp[i];
                        arrayXuLyTemp[i] = arrayXuLyTemp[j];
                        arrayXuLyTemp[j] = bufferForArray;

                        //thay đổi vị trí danh sách chính : userlist
                        TB_Department bufferForList = arrayUser[i];
                        arrayUser[i] = arrayUser[j];
                        arrayUser[j] = bufferForList;
                    }
                }
            }
        }

        //Sắp xếp mảng Department giảm theo giá trị giảm của mảng phụ
        public void SapXepGiamDan(TB_Department[] arrayUser, double[] arrayXuLyTemp)
        {
            for (int i = 0; i < arrayXuLyTemp.Count() - 1; i++)
            {
                for (int j = i + 1; j < arrayXuLyTemp.Count(); j++)
                {
                    if (arrayXuLyTemp[j] > arrayXuLyTemp[i])
                    {
                        //thay đổi vị trí mảng tạm
                        double bufferForArray = arrayXuLyTemp[i];
                        arrayXuLyTemp[i] = arrayXuLyTemp[j];
                        arrayXuLyTemp[j] = bufferForArray;

                        //thay đổi vị trí danh sách chính : userlist
                        TB_Department bufferForList = arrayUser[i];
                        arrayUser[i] = arrayUser[j];
                        arrayUser[j] = bufferForList;
                    }
                }
            }
        }

#endregion


        #region Phần Phân trang

        /// <summary>
        /// Chuyển paging sang tiếng việt
        /// </summary>
        /// <param name="pagerOptions">PagerOptions muốn thay đổi thuộc tính</param>
        /// <param name="PageIndexParameterName">Tên đặt của chỉ số trang</param>
        public void ChangeTextPaging(PagerOptions pagerOptions, string PageIndexParameterName)
        {
            pagerOptions.PageIndexParameterName = string.IsNullOrEmpty(PageIndexParameterName) ? "id" : PageIndexParameterName;
            pagerOptions.NextPageText = "Tiếp";
            pagerOptions.PrevPageText = "Lùi";
            pagerOptions.FirstPageText = "Đầu";
            pagerOptions.LastPageText = "Cuối";
            pagerOptions.CurrentPageNumberFormatString = "[{0}]";
        }


        #endregion

        #region

        public SelectList BuildSelectListNone()
        {
            IList<object> selectList = new List<object> { new { Value = 0, Text = "-- Chọn Quy trình --" } };

            return new SelectList(selectList, "Value", "Text");
        }
        #endregion

        #region Hàm mã hóa

        public string EncodeSHA1(string pass)
        {
            SHA1CryptoServiceProvider sha1 = new SHA1CryptoServiceProvider();
            byte[] bs = System.Text.Encoding.UTF8.GetBytes(pass);
            bs = sha1.ComputeHash(bs);
            System.Text.StringBuilder s = new System.Text.StringBuilder();
            foreach (byte b in bs)
            {
                s.Append(b.ToString("x1").ToLower());
            }
            pass = s.ToString();
            return pass;
        }
        #endregion


        #region BACNP

        /// <summary>
        /// Lấy danh sách tháng không nằm trong danh sách tháng cho trước
        /// </summary>
        /// <returns></returns>
        public IList<int> GetThangKhongTonTaiTrongDanhSachChoTruoc(IList<int> lstThang)
        {
            //Danh sách tháng không tồn tại trong danh sách cho trước
            var result = new List<int>();

            for (var indexThang = 1; indexThang <= 12; indexThang++)
            {
                if (!lstThang.Contains(indexThang))
                {
                    result.Add(indexThang);
                }
            }

            return result;
        }

        //BACNP
        /// <summary>
        /// Chuyển chuỗi số thực thành kiểu số thực
        /// </summary>
        /// <param name="strNumber"></param>
        /// <returns></returns>
        public Decimal ConvertStringToDecimal(string strNumber)
        {
            Decimal result = 0;
            try
            {
                result = Decimal.Parse(strNumber.Replace(',', ' '));
            }
            catch
            { }
            return result;
        }

        //BACNP
        /// <summary>
        /// Chuyển số thực thành chuỗi
        /// </summary>
        /// <param name="number"></param>
        /// <returns></returns>
        public string ConvertDecimalToMoneyString(decimal? number)
        {
            return number != null ? number.Value.ToString("#,0") : "0";
        }

        #endregion
    }
}